﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SegIdenMovil.Entidad;
using GS1.Library;
using SegIdenMovil.Herramientas;
using SegIdenMovil.Delegate;

namespace SegIdenMovil
{
    public partial class frmRecProvLocGuiaDetalle : Form
    {
        #region --- Variables y Constantes ---
        public Guia guia { get; set; }

        public bool esOrdenCompra { get; set; }

        public OrdenCompra ordenCompra { get; set; }
        public Mantenimiento mantenimiento { get; set; }

        private string codigoBarraActual = string.Empty;
        
        private LineaOrdenCompra lineaOrdenCompraActual = null;
        private Item itemActual = null;

        private ListViewItem viewItemActual = null;

        private ListaLineaGuia listaLineaGuia = null;

        private const int INDICE_COLUMNA_PRODUCTO_DESCRIPCION = 2;
        private const int INDICE_COLUMNA_CANTIDAD_RECIBIR = 3;
        private const int INDICE_COLUMNA_CANTIDAD_ATENDIENDO = 4;
        #endregion

        #region --- Constructor ---
        public frmRecProvLocGuiaDetalle()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmRecProvLocGuiaDetalle_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void frmRecProvLocGuiaDetalle_Closing(object sender, CancelEventArgs e)
        {
            activarScanner(false);
        }

        private void mnuCancelar_Click(object sender, EventArgs e)
        {
            salir(DialogResult.Cancel);
        }

        private void mnuGuardar_Click(object sender, EventArgs e)
        {
            guardar();
        }

        private void lvwListado_SelectedIndexChanged(object sender, EventArgs e)
        {
            seleccionarItemLista();
        }

        private void btnCapturaCodigo_Click(object sender, EventArgs e)
        {
            // Estableciendo codigo de barras leido
            this.codigoBarraActual = "123456789";

            procesarCodigoBarra();
        }
        #endregion

        #region --- Metodo y Evento Scanner ---
        private void activarScanner(bool estado)
        {
            if (estado)
            {
                if (ParametrosAplicacion.scanner == null) { ParametrosAplicacion.scanner = new GS1.Scanner.Scan(this); }
                ParametrosAplicacion.scanner.EscanearDato += new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                ParametrosAplicacion.scanner.ActivarScan();
            }
            else
            {
                if (ParametrosAplicacion.scanner != null)
                {
                    ParametrosAplicacion.scanner.EscanearDato -= new GS1.Scanner.Scan.EscanearDatoEventHandler(scanner_EscanearDato);
                    if (ParametrosAplicacion.scanner.IsActive) { ParametrosAplicacion.scanner.DesActivarScan(); }
                }
            }
        }

        private void scanner_EscanearDato(string pTipo, string pDato)
        {
            // Estableciendo codigo de barras leido
            this.codigoBarraActual = pDato;

            procesarCodigoBarra();
            
        }
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            try
            {
                Cursor.Current = Cursors.WaitCursor;
                this.WindowState = FormWindowState.Maximized;

                // Se instancia Listado de lineas de la guia a registrar
                this.listaLineaGuia = new ListaLineaGuia();

                // Se agrega muestra el detalle de OC
                this.lvwListado.BeginUpdate();
                this.lvwListado.Items.Clear();

                ListViewItem nuevoItem = null;

                if (this.esOrdenCompra)
                {
                    // Cuando es por orden de compra
                    formatoGrillaOrdenCompra();

                    foreach (LineaOrdenCompra lineaOrdenCompra in this.ordenCompra.listaLineaOrdenCompra.lista)
                    {
                        nuevoItem = new ListViewItem(lineaOrdenCompra.producto.codigo);
                        nuevoItem.SubItems.Add(lineaOrdenCompra.producto.codProductoProveedor);
                        nuevoItem.SubItems.Add(lineaOrdenCompra.producto.descripcion);
                        nuevoItem.SubItems.Add(lineaOrdenCompra.cantidad);
                        nuevoItem.SubItems.Add(lineaOrdenCompra.cantidadRecibida);

                        this.lvwListado.Items.Add(nuevoItem);
                    }
                }
                else
                {
                    // Cuando es por mantenimiento
                    formatoGrillaMantenimiento();

                    foreach (Item item in this.mantenimiento.listaItem.lista)
                    {
                        nuevoItem = new ListViewItem(item.producto.codigo);
                        nuevoItem.SubItems.Add(item.producto.codProductoProveedor);
                        nuevoItem.SubItems.Add(item.producto.descripcion);

                        this.lvwListado.Items.Add(nuevoItem);
                    }
                }

                this.lvwListado.EndUpdate();

                // Se aplica estilo a listview
                //Utilitario.aplicarEstiloGrilla(this.lvwListado, this);
                Utilitario.aplicarEstiloGrilla(this.lvwListado,
                                               this,
                                               lvwListado_DoubleClick);
                // Activar Scanner
                activarScanner(true);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void formatoGrillaOrdenCompra()
        {
            // Borrando Items
            this.lvwListado.Items.Clear();

            // Borrando columnas
            this.lvwListado.Columns.Clear();

            // Agregando las columnas para ordencompra
            this.lvwListado.Columns.Add(this.colCodigo);
            this.lvwListado.Columns.Add(this.colCodProductoProveedor);
            this.lvwListado.Columns.Add(this.colDescripcion);
            this.lvwListado.Columns.Add(this.colCantPedida);
            this.lvwListado.Columns.Add(this.colCantRecibida);
        }

        private void formatoGrillaMantenimiento()
        {
            // Borrando Items
            this.lvwListado.Items.Clear();

            // Borrando columnas
            this.lvwListado.Columns.Clear();

            // Agregando las columnas para mantenimiento
            this.lvwListado.Columns.Add(this.colCodigo);
            this.lvwListado.Columns.Add(this.colCodProductoProveedor);
            this.lvwListado.Columns.Add(this.colDescripcion);
        }

        private void seleccionarItemLista()
        {
            if (this.lvwListado.SelectedIndices.Count == 0) { return; }

            // Obteniendo item de listview seleccionado
            this.viewItemActual = this.lvwListado.Items[this.lvwListado.SelectedIndices[0]];

            // Validar el documento a trabajar OC/Mantenimiento
            if (this.esOrdenCompra)
            {
                // Obteniendo linea de orden de compra seleccionada
                this.lineaOrdenCompraActual = this.ordenCompra.listaLineaOrdenCompra.lista[this.viewItemActual.Index];
                this.lineaOrdenCompraActual.producto = obtenerProductoyComponentes(this.lineaOrdenCompraActual.producto.codigo);
            }
            else
            {
                // Obteniendo item de mantenimiento seleccionada
                this.itemActual = this.mantenimiento.listaItem.lista[this.viewItemActual.Index];
            }

            // Actualizando indicador de lectura de codigos de barras
            this.pnlLecturaCB.BackColor = Color.White;
            this.lblLecturaCB.Text = Constantes.DESCRIPCION_NO;


        }

        private void guardar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (!Util.ShowMessageboxPregunta("¿Esta seguro de guardar la Recepción?")) { return; }

                Cursor.Current = Cursors.WaitCursor;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = this.esOrdenCompra ? Constantes.OPERACION_REGISTRAR_GUIA : Constantes.OPERACION_REGISTRAR_GUIA_DOCUMENTO;

                operacion.guia = this.guia;

                if (this.esOrdenCompra)
                {
                    operacion.guia.listaOrdenCompra = new ListaOrdenCompra();
                    ordenCompra.estado = EvaluaEstado();
                    operacion.guia.listaOrdenCompra.add(ordenCompra);
                }

                operacion.guia.listaLineaGuia = listaLineaGuia;
               
                operacion.guia.estado = Constantes.ESTADO_DOCUMENTO_DESPACHADO;

                operacion.guia.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                // Instanciando y ejecutando llamada al ServicioREST
                using (ConexionREST conexionREST = new ConexionREST())
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Util.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Util.ShowMessageboxInfo("Guia guardado correctamente");
                }
                else
                {
                    Util.ShowMessageboxError("No se guardo los datos");
                    return;
                }

                salir(DialogResult.OK);
            }
            catch (Exception ex)
            {
                Util.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private bool validarRepetidoCodigoBarra()
        {
            bool resultado = false;

            foreach (LineaGuia lineaGuia in this.listaLineaGuia.lista)
            {
                foreach (LineaGuiaItem lineaGuiaItem in lineaGuia.listaLineaGuiaItem.lista)
                {
                    if (lineaGuiaItem.item.codificacion.Equals(this.codigoBarraActual))
                    {
                        resultado = true;
                        break;
                    }
                }
            }

            return resultado;
        }

        private void procesarCodigoBarra()
        {
            LineaGuia lineaGuia = null;
            bool esNuevo = false;
            int cantidadRecibir = 0;
            int cantidadAtendiendo = 0;

            // Validar que se haya seleccionado un elemento de la grilla
            if (this.lineaOrdenCompraActual == null && this.itemActual == null)
            {
                Util.ShowMessageboxExclamacion("Debe seleccionar un producto de lista a recibir");
                return;
            }

            // Validar duplicidad de codigo de barra
            if (validarRepetidoCodigoBarra())
            {
                Util.ShowMessageboxExclamacion("El código de barra ya se encuentra recibido");
                return;
            }

            // Validar si el producto seleccionado tiene componentes
            if (this.lineaOrdenCompraActual.producto.componentes.Equals(Constantes.SI) && this.itemActual == null)
            {
                Util.ShowMessageboxExclamacion("El producto tiene componentes");
                return;
            }

            // Validar el documento a trabajar OC/Mantenimiento
            if (this.esOrdenCompra)
            {
                // Obteniendo cantidades
                cantidadRecibir = Convert.ToInt32(this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_RECIBIR].Text);
                cantidadAtendiendo = Convert.ToInt32(this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text);

                // Aumentada a la cantidad de items atendidos
                cantidadAtendiendo++;

                // Validar si se puede atender item actual
                if (cantidadRecibir < cantidadAtendiendo)
                {
                    Util.ShowMessageboxExclamacion("No se puede recibir mas items del producto: " +
                                                   this.viewItemActual.SubItems[INDICE_COLUMNA_PRODUCTO_DESCRIPCION].Text, this.Text);
                    return;
                }

                this.ordenCompra.listaLineaOrdenCompra.lista[this.viewItemActual.Index].cantidadRecibida = cantidadAtendiendo.ToString();

                // Cambiar de color de la fila, para indicar si esta completo o imparcial
                this.viewItemActual.BackColor = cantidadRecibir == cantidadAtendiendo ? Color.Green : Color.Yellow;

                // Actualizando indicador de lectura de codigos de barras
                this.pnlLecturaCB.BackColor = Color.Green;
                this.lblLecturaCB.Text = Constantes.DESCRIPCION_SI;

                // Actualizando columna cantidad atendida de la grilla
                this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text = cantidadAtendiendo.ToString();

                // Si es el primer item entonces es una nueva recepcion
                //se debe restar la cantidad atendiedno - la cantidad inicial que se habia atendido
                esNuevo = (cantidadAtendiendo - Convert.ToInt32(this.ordenCompra.listaLineaOrdenCompra.lista[this.viewItemActual.Index].cantidadRecibidaOriginalmente) == 1);

                //  Instanciando linea item de guia 
                LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                lineaGuiaItem.item = new Item();

                // Se establece el codigo del producto
                lineaGuiaItem.item.producto = new Producto();
                lineaGuiaItem.item.producto.codigo = this.lineaOrdenCompraActual.producto.codigo;

                // Se establece el codigo de barra del item
                lineaGuiaItem.item.codificacion = this.codigoBarraActual;

                // Se establece el proveedor
                lineaGuiaItem.item.proveedor = new Proveedor();
                lineaGuiaItem.item.proveedor.codProveedor = this.ordenCompra.proveedor.codProveedor;

                // Estableciendo campos simples
                lineaGuiaItem.item.origen = this.ordenCompra.origen;
                lineaGuiaItem.item.propiedades = this.txtPropiedades.Text;
                lineaGuiaItem.item.precioCompra = this.lineaOrdenCompraActual.precioExworks;

                // Estableciendo el tipo de moneda
                lineaGuiaItem.item.moneda = this.ordenCompra.moneda;

                // Estableciendo los datos de la linea de la orden de compra
                lineaGuiaItem.item.lineaOrdenCompra = new LineaOrdenCompra();
                lineaGuiaItem.item.lineaOrdenCompra.codOC = this.lineaOrdenCompraActual.codOC;
                lineaGuiaItem.item.lineaOrdenCompra.numeroLinea = this.lineaOrdenCompraActual.numeroLinea;

                // Estableciendo la tienda donde se esta haciendo la recepcion del item
                lineaGuiaItem.item.tienda = this.guia.tiendaDestino;

                // Estableciendo estado
                lineaGuiaItem.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                if (esNuevo)
                {
                    // Instanciando linea de guia
                    lineaGuia = new LineaGuia();

                    //  Estableciendo producto
                    lineaGuia.producto = new Producto();
                    lineaGuia.producto.codigo = this.lineaOrdenCompraActual.producto.codigo;

                    // Instanciando listado de guia-item
                    lineaGuia.listaLineaGuiaItem = new ListaLineaGuiaItem();

                    // Agregando al listado de guia item
                    lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                    // Estableciendo cantidad de item recibido
                    lineaGuia.cantidad = cantidadAtendiendo.ToString();

                    // Se agrega linea de guia
                    this.listaLineaGuia.add(lineaGuia);
                }
                else
                {
                    // Obteniendo linea de guia
                    lineaGuia = this.listaLineaGuia.lista[this.viewItemActual.Index];

                    // Agregando al listado de guia item
                    lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                    // Actualizando cantidad de item  recibido
                    lineaGuia.cantidad = cantidadAtendiendo.ToString();
                }
            }
            else
            {
                // Validar por el color si la fila, ya fue recepcionada
                if (this.viewItemActual.BackColor == Color.Green)
                {
                    Util.ShowMessageboxExclamacion("El el producto ya fue recepcionado: " +
                                                   this.viewItemActual.SubItems[INDICE_COLUMNA_PRODUCTO_DESCRIPCION].Text, this.Text);
                    return;
                }

                // Actualizando indicador de lectura de codigos de barras
                this.pnlLecturaCB.BackColor = Color.Green;
                this.lblLecturaCB.Text = Constantes.DESCRIPCION_SI;

                // Cambiar de color de la fila, para indicar si esta completo
                this.viewItemActual.BackColor = Color.Green;

                //  Instanciando linea item de guia 
                LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();

                // Se instancia Item a recibir
                lineaGuiaItem.item = new Item();

                // Se establece el codigo y codigo de barra del item
                lineaGuiaItem.item.codItem = this.itemActual.codItem;
                lineaGuiaItem.item.codificacion = this.codigoBarraActual;

                // Se establece el codigo del producto
                lineaGuiaItem.item.producto = new Producto();
                lineaGuiaItem.item.producto.codigo = this.itemActual.producto.codigo;

                // Se establece el proveedor
                lineaGuiaItem.item.proveedor = new Proveedor();
                lineaGuiaItem.item.proveedor.codProveedor = this.mantenimiento.proveedor.codProveedor;

                // Estableciendo campos simples
                lineaGuiaItem.item.propiedades = this.txtPropiedades.Text;

                // Estableciendo la tienda donde se esta haciendo la recepcion del item
                lineaGuiaItem.item.tienda = this.guia.tiendaDestino;

                // Estableciendo estado
                lineaGuiaItem.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                // Instanciando linea de guia
                lineaGuia = new LineaGuia();

                //  Estableciendo producto
                lineaGuia.producto = new Producto();
                lineaGuia.producto.codigo = this.itemActual.producto.codigo;

                // Instanciando listado de guia-item
                lineaGuia.listaLineaGuiaItem = new ListaLineaGuiaItem();

                // Agregando al listado de guia item
                lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                // Estableciendo cantidad de item recibido
                lineaGuia.cantidad = cantidadAtendiendo.ToString();

                // Se agrega linea de guia
                this.listaLineaGuia.add(lineaGuia);
            }
            
        }

        private void salir(DialogResult resultado)
        {
            this.DialogResult = resultado;
        }

        private String EvaluaEstado()
        {
            String EstadoOC = Constantes.ESTADO_OC_RECEPCIONADO;
            //barrer todo lvwListado y ver que cantidad recibida sea = a cantidad esperada
            foreach (ListViewItem viewItem in this.lvwListado.Items)
            {
                int cantidadRecibir = Convert.ToInt32(viewItem.SubItems[INDICE_COLUMNA_CANTIDAD_RECIBIR].Text);
                int cantidadAtendiendo = Convert.ToInt32(viewItem.SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text);
                if (cantidadRecibir > cantidadAtendiendo)
                {
                    EstadoOC = Constantes.ESTADO_OC_PENDIENTE;
                }
            }

            return EstadoOC;
        }

        private void lvwListado_DoubleClick(object sender, EventArgs e)
        {
            int cantidadRecibir = 0;
            int cantidadAtendiendo = 0;
            LineaGuia lineaGuia = null;
            bool esNuevo = false;
            
            //sirve para abrir ventana para registrar componentes
            if (this.esOrdenCompra)
            {
                //pregunta si tiene componentes
                if (this.lineaOrdenCompraActual.producto.componentes.Equals(Constantes.SI))
                {
                    // Obteniendo cantidades
                    cantidadRecibir = Convert.ToInt32(this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_RECIBIR].Text);
                    cantidadAtendiendo = Convert.ToInt32(this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text);

                    // Aumentada a la cantidad de items atendidos para validar si está completo
                    cantidadAtendiendo++;

                    // Validar si se puede atender item actual
                    if (cantidadRecibir < cantidadAtendiendo)
                    {
                        Util.ShowMessageboxExclamacion("No se puede recibir mas items del producto: " +
                                                       this.viewItemActual.SubItems[INDICE_COLUMNA_PRODUCTO_DESCRIPCION].Text, this.Text);
                        return;
                    }
                    
                    // Si es el primer item entonces es una nueva recepcion
                    //se debe restar la cantidad atendiedno - la cantidad inicial que se habia atendido
                    esNuevo = (cantidadAtendiendo - Convert.ToInt32(this.ordenCompra.listaLineaOrdenCompra.lista[this.viewItemActual.Index].cantidadRecibidaOriginalmente) == 1);

                    //  Instanciando linea item de guia que será enviada a la otra pantalla
                    LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                    lineaGuiaItem.item = new Item();

                    // Se establece el codigo del producto
                    lineaGuiaItem.item.producto = new Producto();
                    lineaGuiaItem.item.producto = this.lineaOrdenCompraActual.producto;

                    // Se establece el codigo de barra del item esta vacío por lo que se mantiene en null
                    //lineaGuiaItem.item.codificacion = null;

                    // Se establece el proveedor
                    lineaGuiaItem.item.proveedor = new Proveedor();
                    lineaGuiaItem.item.proveedor = this.ordenCompra.proveedor;

                    // Estableciendo campos simples
                    lineaGuiaItem.item.origen = this.ordenCompra.origen;
                    lineaGuiaItem.item.propiedades = this.txtPropiedades.Text;
                    lineaGuiaItem.item.precioCompra = this.lineaOrdenCompraActual.precioExworks;

                    // Estableciendo el tipo de moneda
                    lineaGuiaItem.item.moneda = this.ordenCompra.moneda;

                    // Estableciendo los datos de la linea de la orden de compra
                    lineaGuiaItem.item.lineaOrdenCompra = new LineaOrdenCompra();
                    lineaGuiaItem.item.lineaOrdenCompra = this.lineaOrdenCompraActual;

                    // Estableciendo la tienda donde se esta haciendo la recepcion del item
                    lineaGuiaItem.item.tienda = this.guia.tiendaDestino;

                    // El estado se establece cuando se completen todas las partes del item
                    //lineaGuiaItem.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                    //Aca llama a la pantalla para cargar los componentes
                    try
                    {

                        using (frmRecImpDocItemComp frmRecImpDocItemComp = new frmRecImpDocItemComp())
                        {
                            //Objeto item que viaja y se completa con los datos recibidos
                            //Sirve para identificar que el item es recien creado
                            lineaGuiaItem.item.codItem = Constantes.VALOR_CERO;

                            // Se establece codificacion vacio por que tiene componentes
                            lineaGuiaItem.item.codificacion = string.Empty;

                            //carga los datos del producto
                            frmRecImpDocItemComp.producto = this.lineaOrdenCompraActual.producto;

                            //Se resta uno, por que para validar si se podia atender se habia incrementado 1, pero aún no se recibía
                            frmRecImpDocItemComp.cantidadRecibida = cantidadAtendiendo-1;

                            //enviar los componenetes ya recibidos item.listaItemComponente o envia el item vacío
                            frmRecImpDocItemComp.itemComponenteAsignado = lineaGuiaItem.item;

                            if (frmRecImpDocItemComp.ShowDialog() == DialogResult.Cancel) { frmRecImpDocItemComp.Dispose(); return; }

                            // Estableciendo estado
                            if (frmRecImpDocItemComp.itemComponenteAsignado.estado.Equals(Constantes.ESTADO_ITEM_EN_BULTO)) lineaGuiaItem.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                            // Estableciendo la lista de item-componentes
                            lineaGuiaItem.item.listaItemComponente = frmRecImpDocItemComp.listaItemComponente;

                            // Estableciendo la cantidad de item recibidos desde frmRecImpDocItemComp
                            cantidadAtendiendo = frmRecImpDocItemComp.cantidadRecibida;

                            this.ordenCompra.listaLineaOrdenCompra.lista[this.viewItemActual.Index].cantidadRecibida = cantidadAtendiendo.ToString();

                            // Cambiar de color de la fila, para indicar si esta completo o imparcial
                            this.viewItemActual.BackColor = cantidadRecibir == cantidadAtendiendo ? Color.Green : Color.Yellow;

                            // Actualizando columna cantidad atendida de la grilla
                            this.viewItemActual.SubItems[INDICE_COLUMNA_CANTIDAD_ATENDIENDO].Text = cantidadAtendiendo.ToString();
                        }

                    }
                    catch (Exception ex)
                    {
                        Util.MensajeError(ex, this.Text);
                    }
                    finally
                    {
                        Cursor.Current = Cursors.Default;
                    }

                    if (esNuevo)
                    {
                        // Instanciando linea de guia
                        lineaGuia = new LineaGuia();

                        //  Estableciendo producto
                        lineaGuia.producto = new Producto();
                        lineaGuia.producto.codigo = this.lineaOrdenCompraActual.producto.codigo;

                        // Instanciando listado de guia-item
                        lineaGuia.listaLineaGuiaItem = new ListaLineaGuiaItem();

                        // Agregando al listado de guia item
                        lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                        // Estableciendo cantidad de item recibido
                        lineaGuia.cantidad = cantidadAtendiendo.ToString();

                        // Se agrega linea de guia
                        this.listaLineaGuia.add(lineaGuia);
                    }
                    else
                    {
                        // Obteniendo linea de guia
                        lineaGuia = this.listaLineaGuia.lista[this.viewItemActual.Index];

                        // Agregando al listado de guia item
                        lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                        // Actualizando cantidad de item  recibido
                        lineaGuia.cantidad = cantidadAtendiendo.ToString();
                    }

                }
            }
           
            //si no tiene componentes sirve para abrir pantalla con imagen
            //if (!this.lvwListado.Focused) { return; }
            //string codigoProducto = string.Empty;
            //Producto producto = null;

            //try
            //{
            //    Cursor.Current = Cursors.WaitCursor;

            //    // Obteniendo codigo del producto a mostrar su imagen
            //    codigoProducto = this.lvwListado.Items[this.lvwListado.SelectedIndices[0]].Text;
            //    producto = obtenerProductoyComponentes(codigoProducto);

            //    if (producto != null)
            //    {
            //        if (!producto.imagen.Equals(string.Empty))
            //        {
            //            using (frmProductoImagen frmProductoImagen = new frmProductoImagen())
            //            {
            //                frmProductoImagen.imagenProducto = producto.imagen.base64ToImage();
            //                frmProductoImagen.ShowDialog();
            //            }
            //        }
            //        else
            //        {
            //            Util.ShowMessageboxExclamacion("El producto seleccionado no tiene una imagen asignada.");
            //        }
            //    }
            //    else
            //    {
            //        Util.ShowMessageboxExclamacion("No se encontro los datos del producto seleccionado.");
            //    }
            //}
            //catch (Exception ex)
            //{
            //    Util.MensajeError(ex, this.Text);
            //}
            //finally
            //{
            //    Cursor.Current = Cursors.Default;
            //}
        }

        private Producto obtenerProductoyComponentes(string codigoProducto)
        {
            Producto producto = null;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_PRODUCTO;
            operacion.producto = new Producto { codigo = codigoProducto };

            operacion.tienda = new Tienda();
            operacion.tienda = ParametrosAplicacion.TIENDA_ACTUAL;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Util.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            // Obteniendo Objeto de Producto
            producto = contenidoXML.DeserializarTo<Producto>();

            return producto;
        }


        //private Item obtenerItem(string codigoitem)
        //{
        //    Item item = null;
        //    Operacion operacion = null;
        //    string contenidoXML = string.Empty;

        //    // Estableciendo operacion a ser enviada al Servicio REST
        //    operacion = new Operacion();
        //    operacion.numero = Constantes.OPERACION_OBTENER_ITEM;
        //    operacion.item = new Item { codItem = codigoitem };

        //    // Instanciando y ejecutando llamada al ServicioREST
        //    ConexionREST conexionREST = new ConexionREST();
        //    contenidoXML = conexionREST.ejecutarOperacion(operacion);

        //    // Obteniendo Objeto de Error
        //    OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

        //    // Validar si hay error
        //    if (operacionError != null)
        //    {
        //        Util.ShowMessageboxError(operacionError.descripcion);
        //        return null;
        //    }

        //    // Obteniendo Objeto de Producto
        //    item = contenidoXML.DeserializarTo<Item>();

        //    return item;

        //}

        #endregion
    }
}